#include "client_widget.h"
#include "ui_client_widget.h"
#include <QMessageBox>
Client_widget::Client_widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Client_widget)
{
    ui->setupUi(this);

    tcpSocket = nullptr;
    tcpSocket = new QTcpSocket(this);
    setWindowTitle("客户端");

    //连接成功时会触发connected信号
    connect(tcpSocket,&QTcpSocket::connected,
            [=]()
            {
                ui->textEditRead->setText("成功于服务器建立连接！");
            }
            );
    //处理从服务器发来的数据
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
            {
                //取出来
                QByteArray array = tcpSocket->readAll();
                //追加到编辑区
                ui->textEditRead->append(array);

            }
            );
    //连接失败时的错误处理
    connect(tcpSocket,&QTcpSocket::errorOccurred,
            [=](QAbstractSocket::SocketError error)
            {
                ui->textEditRead->setText(QString("连接失败！错误代码：%1").arg(error));
            }
            );

    //连接断开时的处理
    connect(tcpSocket,&QTcpSocket::disconnected,
            [=]()
            {
                ui->textEditRead->append("与服务器断开连接！");
            }
            );

}

Client_widget::~Client_widget()
{
    delete ui;
}

//连接服务器
void Client_widget::on_ButtonConnet_clicked()
{
    //检查socket状态，防止重复连接
    if(tcpSocket->state() == QAbstractSocket::ConnectedState)
    {
        ui->textEditRead->setText("已经连接到服务器！");
        return;
    }
    
    if(tcpSocket->state() == QAbstractSocket::ConnectingState)
    {
        ui->textEditRead->setText("正在连接中，请稍等...");
        return;
    }
    
    //如果之前有连接，先断开
    if(tcpSocket->state() != QAbstractSocket::UnconnectedState)
    {
        tcpSocket->disconnectFromHost();
        tcpSocket->waitForDisconnected(1000); //等待1秒断开
    }

    // 本地回环地址(测试本地网络服务、程序调试)
    // IPv4 协议中，整个 127.0.0.0/8 网段（子网掩码 255.0.0.0）均为本地回环地址，
    // 包含从 127.0.0.1 到 127.255.255.254 的所有 IP 地址。

    //获取服务器的IP和端口
    QString IP = ui->lineEditIP->text();
    quint16 port = ui->lineEditPort->text().toInt();
    
    //主动和服务器建立连接
    //注意：ip的参数类型是QHostAddress，端口的类型是：quint16
    tcpSocket->connectToHost(QHostAddress(IP),port);
}

//客户端向服务器发送数据
void Client_widget::on_ButtonSend_clicked()
{
    //获取编辑区数据
    QString data = ui->textEditWrite->toPlainText();

    //发送数据
    tcpSocket->write(data.toUtf8().data());
}

//主动和服务器断开连接
void Client_widget::on_ButtonClose_clicked()
{
    //先判断
    if(tcpSocket == nullptr)
    {
        return ;
    }

    // 弹出确认对话框，询问用户是否断开连接
    QMessageBox::StandardButton userChoice ;
    userChoice = QMessageBox::question
        (
            this,                 // 父窗口（对话框居中显示在当前窗口上）
            "断开连接确认",        // 对话框标题
            "确定要断开与服务器的连接吗？",  // 提示内容
            QMessageBox::Yes | QMessageBox::No  // 显示“是”和“否”两个按钮
            );
    if(userChoice == QMessageBox::Yes)
    {
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
}


